package com.ssy.lingxi.order.service.web;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.constant.OrderPromotionStatusEnum;
import com.ssy.lingxi.order.model.vo.basic.request.*;
import com.ssy.lingxi.order.model.vo.basic.response.*;
import com.ssy.lingxi.order.model.vo.buyer.request.*;
import com.ssy.lingxi.order.model.vo.buyer.response.*;
import org.springframework.http.HttpHeaders;

import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;

/**
 * 采购订单相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-19
 */
public interface IBuyerOrderService {
    /**
     * （待分配订单页面） 获取前端页面下拉框列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<List<DropdownItem>> getTakePageItems(HttpHeaders headers);

    /**
     * “待分配订单” - 查询订单列表
     * @param headers  Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BaseBuyerOrderQueryVO>> pageToTakeOrders(HttpHeaders headers, OrderPageVO pageVO);

    /**
     * “待分配订单” - 订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getToTakeOrderDetail(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待分配订单” - 领取订单
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> takeOrder(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待分配订单” - 批量领取订单
     * @param headers Http头部信息
     * @param orderIds 订单Id列表
     * @return 操作结果
     */
    Wrapper<Void> batchTakeOrders(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * （订单查询页面）获取前端页面下拉框列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<PageItemVO> getPageItems(HttpHeaders headers);

    /**
     * 分页查询订单
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerOrderQueryVO>> pageOrders(HttpHeaders headers, OrderManagePageVO pageVO);

    /**
     * 订单退款
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 退款结果
     */
    Wrapper<Void> orderRefund(HttpHeaders headers, OrderIdVO idVO);

    /**
     * 订单退款
     * @param loginUser 订单退款
     * @param idVO 接口参数
     * @return 退款结果
     */
    Wrapper<Void> orderRefund(UserLoginCacheDTO loginUser, OrderIdVO idVO);

    /**
     * 分页查询订单 - 订单删除
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<Void> pageOrderDelete(HttpHeaders headers, OrderIdVO idVO);

    /**
     * 分页查询订单 - 订单删除
     * @param loginUser 用户信息
     * @param idVO      接口参数
     * @return 操作结果
     */
    Wrapper<Void> pageOrderDelete(UserLoginCacheDTO loginUser, OrderIdVO idVO);

    /**
     * 订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getOrderDetail(HttpHeaders headers, OrderIdVO idVO);

    /**
     * 采购订单详情 - 申请开票
     * @param headers Http头部信息
     * @param invoiceVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> applyInvoice(HttpHeaders headers, BuyerApplyInvoiceVO invoiceVO);

    /**
     * 取消订单
     * @param headers Http头部信息
     * @param reasonVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> cancelOrder(HttpHeaders headers, OrderReasonVO reasonVO);

    /**
     * 根据供应商会员信息和商城id获取预约时长和配置配送时间段
     * @param headers HttpHeaders信息
     * @param deliveryDateVO 接口参数
     * @return 查询结果
     */
    Wrapper<OrderDeliveryDateVO> findBuyerDeliveryDate(HttpHeaders headers, DeliveryDateVO deliveryDateVO);

    /**
     * 查看订单送货时间
     * @param headers Http头部信息
     * @param timeVO 接口参数
     * @return 查询结果
     */
    Wrapper<OrderDeliverTimeDetailVO> getDeliveryTime(HttpHeaders headers, BuyerOrderDeliveryTimeVO timeVO);

    /**
     * 订单查询导出
     * @param token 登录token
     * @param pageVO 接口参数
     * @param response 响应体
     */
    void exportOrders(HttpServletResponse response, OrderManagePageVO pageVO, String token);

    /**
     * 未发货调整订单送货时间
     * @param headers Http头部信息
     * @param updateVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> updateDeliveryTime(HttpHeaders headers, BuyerOrderDeliveryTimeUpdateVO updateVO);

    /**
     * 取消订单
     * @param loginUser 登录用户
     * @param reasonVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> cancelOrder(UserLoginCacheDTO loginUser, OrderReasonVO reasonVO);

    /**
     * “待新增订单” - 获取前端页面下拉框列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<BuyerToCreatePageItemVO> getToCreatePageItems(HttpHeaders headers);

    /**
     * “待新增订单” - 分页查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerToCreateQueryVO>> pageToCreateOrders(HttpHeaders headers, OrderPageVO pageVO);

    /**
     * “待新增订单” - 分页查询SRM订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerToCreateQueryVO>> pageSrmOrders(HttpHeaders headers, OrderPageVO pageVO);

    /**
     * “待新增订单” - 创建SRM订单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 创建结果
     */
    Wrapper<Void> createSrmOrder(HttpHeaders headers, BuyerSrmOrderVO orderVO);

    /**
     * “待新增订单” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getToCreateOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待新增订单” - 修改Srm订单
     * @param headers Http头部信息
     * @param updateVO 接口参数
     * @return 修改结果
     */
    Wrapper<Void> updateSrmOrder(HttpHeaders headers, BuyerSrmOrderUpdateVO updateVO);

    /**
     * “待新增订单” - “创建B2B订单” - 查询支付环节列表
     * @param headers Http头部信息
     * @param payVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<BuyerOrderPayNodeDetailVO>> findBusinessOrderProcessPayment(HttpHeaders headers, OrderProcessPayVO payVO);

    /**
     * “待新增订单” - “修改B2B订单” - 查询支付环节列表
     * @param headers Http头部信息
     * @param updateVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<BuyerOrderPayNodeQueryVO>> findBusinessOrderProcessPaymentUpdate(HttpHeaders headers, BuyerBusinessOrderProcessPayUpdateVO updateVO);

    /**
     * “待新增订单” - B2B订单 - 查询支付方式与支付渠道列表
     * @param headers Http头部信息
     * @param vendorMemberVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<OrderPayTypeDetailVO>> findBusinessOrderPayTypes(HttpHeaders headers, OrderVendorMemberVO vendorMemberVO);

    /**
     * “待新增订单” - 创建B2B订单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 创建结果
     */
    Wrapper<Void> createBusinessOrder(HttpHeaders headers, BuyerBusinessOrderVO orderVO);

    /**
     * “待新增订单” - 修改B2B订单
     * @param headers Http头部信息
     * @param updateVO 接口参数
     * @return 创建结果
     */
    Wrapper<Void> updateBusinessOrder(HttpHeaders headers, BuyerBusinessOrderUpdateVO updateVO);

    /**
     * “待新增订单” - 删除订单
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 删除结果
     */
    Wrapper<Void> deleteOrder(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待新增订单” - 批量删除订单
     * @param headers Http头部信息
     * @param orderIds 接口参数
     * @return 删除结果
     */
    Wrapper<Void> batchDeleteOrder(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * “待新增订单” - 提交
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 删除结果
     */
    Wrapper<Void> submitOrder(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待新增订单” - 批量提交
     * @param headers Http头部信息
     * @param orderIds 接口参数
     * @return 删除结果
     */
    Wrapper<Void> batchSubmitOrder(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * “新增现货采购订单” - 分页查询现货采购订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerToCreateQueryVO>> pagePurchaseOrders(HttpHeaders headers, BuyerOrderCreatePageVO pageVO);

    /**
     * “新增现货采购订单” - 根据商城类型查询订单类型和订单模式
     * @param headers Http头部信息
     * @param shopTypeVO 接口参数
     * @return 查询结果
     */
    Wrapper<OrderModeVO> findPurchaseOrderTypes(HttpHeaders headers, PurchaseOrderShopTypeVO shopTypeVO);

    /**
     * “新增现货采购订单” - 创建现货采购订单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 新增结果
     */
    Wrapper<Void> createPurchaseOrder(HttpHeaders headers, BuyerPurchaseOrderVO orderVO);

    /**
     * “新增现货采购订单” - 修改现货采购订单
     * @param headers Http头部信息
     * @param updateVO 接口参数
     * @return 新增结果
     */
    Wrapper<Void> updatePurchaseOrder(HttpHeaders headers, BuyerPurchaseOrderUpdateVO updateVO);

    /**
     * 请购单订单 - 新增订单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 新增结果
     */
    Wrapper<Void> createRequisitionOrder(HttpHeaders headers, RequisitionOrderCreateVO orderVO);

    /**
     * 请购单订单 - 修改订单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> updateRequisitionOrder(HttpHeaders headers, RequisitionOrderUpdateVO orderVO);

    /**
     * 新增请购单订单 - 分页查询
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 新增结果
     */
    Wrapper<PageData<BuyerToCreateQueryVO>> createRequisitionPage(HttpHeaders headers, BuyerOrderCreatePageVO pageVO);

    /**
     * （订单审核各个页面）获取前端页面下拉框列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<ValidatePageItemVO> getValidatePageItems(HttpHeaders headers);

    /**
     * “待审核订单（一级）” - 分页查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderPageQueryVO>> pageToValidateGradeOneOrders(HttpHeaders headers, OrderPageVO pageVO);

    /**
     * “待审核订单（一级）” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getToValidateGradeOneOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待审核订单（一级）” - 审核
     * @param headers Http头部信息
     * @param agreeVO 接口参数
     * @return 审核结果
     */
    Wrapper<Void> validateOrderGradeOne(HttpHeaders headers, OrderAgreeVO agreeVO);

    /**
     * “待审核订单（一级）” - 审核
     * @param loginUser 登录用户
     * @param agreeVO 接口参数
     * @return 审核结果
     */
    Wrapper<Void> validateOrderGradeOne(UserLoginCacheDTO loginUser, OrderAgreeVO agreeVO);

    /**
     * “待审核订单（一级）” - 批量审核
     * @param headers Http头部信息
     * @param orderIds 接口参数
     * @return 审核结果
     */
    Wrapper<Void> batchValidateOrdersGradeOne(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * “待审核订单（二级）” - 分页查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderPageQueryVO>> pageToValidateGradeTwoOrders(HttpHeaders headers, OrderPageVO pageVO);

    /**
     * “待审核订单（二级）” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getToValidateGradeTwoOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待审核订单（二级）” - 审核
     * @param headers Http头部信息
     * @param agreeVO 接口参数
     * @return 审核结果
     */
    Wrapper<Void> validateOrderGradeTwo(HttpHeaders headers, OrderAgreeVO agreeVO);

    /**
     * “待审核订单（二级）” - 审核
     * @param loginUser 登录用户
     * @param agreeVO 接口参数
     * @return 审核结果
     */
    Wrapper<Void> validateOrderGradeTwo(UserLoginCacheDTO loginUser, OrderAgreeVO agreeVO);

    /**
     * “待审核订单（二级）” - 批量审核
     * @param headers Http头部信息
     * @param orderIds 接口参数
     * @return 审核结果
     */
    Wrapper<Void> batchValidateOrdersGradeTwo(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * “待提交订单” - 分页查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderPageQueryVO>> pageToSubmitOrders(HttpHeaders headers, OrderPageVO pageVO);

    /**
     * “待提交订单” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getToSubmitOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待提交订单” - 提交
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 审核结果
     */
    Wrapper<Void> submitValidateOrder(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待提交订单” - 提交
     * @param loginUser 登录用户
     * @param idVO 接口参数
     * @return 审核结果
     */
    Wrapper<Void> submitValidateOrder(UserLoginCacheDTO loginUser, OrderIdVO idVO);

    /**
     * “待提交订单” - 批量提交
     * @param headers Http头部信息
     * @param orderIds 接口参数
     * @return 审核结果
     */
    Wrapper<Void> batchSubmitValidateOrders(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * “待支付订单” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerToPayQueryVO>> pageToPayOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待支付订单” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getToPayOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待支付订单” - 订单详情 - 查询支付方式与支付渠道列表
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<OrderPayTypeDetailVO>> getToPayOrderPayTypes(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待支付订单” - 订单详情 - 查询支付方式与支付渠道列表
     * @param loginUser 登录用户
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<OrderPayTypeDetailVO>> getToPayOrderPayTypes(UserLoginCacheDTO loginUser, OrderIdVO idVO);

    /**
     * “待支付订单” - 订单支付
     * @param headers HttpHeader信息
     * @param payVO 接口参数
     * @return 支付链接（在线支付）
     */
    Wrapper<PayResultDetailVO> orderPay(HttpHeaders headers, BuyerOrderPayVO payVO);

    /**
     * “待支付订单” - 订单支付
     * @param headers HttpHeader信息
     * @param payVO 接口参数
     * @return 支付链接（在线支付）
     */
    Wrapper<PayResultDetailVO> orderPay(HttpHeaders headers, BuyerMergePayVO payVO);

    /**
     * “待支付订单” - 查询支付结果
     * @param headers HttpHeader信息
     * @param resultVO 接口参数
     * @return 支付结果
     */
    Wrapper<BuyerPayResultDetailVO> findPayResult(HttpHeaders headers, BuyerPayResultVO resultVO);

    /**
     * 订单支付 - 回调接口
     * @param tradeNo 订单交易好
     * @param attach 透传参数
     * @param paySuccess 是否支付成功
     * @return 操作结果
     */
    Wrapper<Void> orderPayCallback(String tradeNo, String attach, Boolean paySuccess);

    /**
     * “待发货订单” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerToDeliveryQueryVO>> pageToDeliveryOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待发货订单” - 订单详情 - 邀请好友拼团 - 生成小程序码分享链接
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 查询结果
     */
    Wrapper<String> createDeliveryMiniAppCode(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待新增采购收货单” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO  接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerOrderReceiveQueryVO>> pageCreateReceiveOrders(HttpHeaders headers, BuyerOrderReceivePageVO pageVO);

    /**
     * “待新增采购收货单” - 创建收货单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> createReceiveOrder(HttpHeaders headers, BuyerCreateReceiveVO orderVO);

    /**
     * “待新增采购收货单” - 查看详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 查询结果
     */
    Wrapper<BuyerReceiveDetailVO> getReceiveDetail(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待新增采购收货单” - 提交审核
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 查询结果
     */
    Wrapper<Void> validateToReceiveOrder(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待确认收货订单” -查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BuyerReceiveQueryVO>> pageToReceiveOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待确认收货订单” -查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<BuyerOrderDetailVO> getToReceiveOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待确认收货订单” - 确认收货
     * @param headers Http头部信息
     * @param receiveVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> receiveOrder(HttpHeaders headers, BuyerReceiveVO receiveVO);

    /**
     * “待确认收货订单” - 确认收货
     * @param userName         登录用户姓名
     * @param organizationName 组织机构名称
     * @param jobTitle         职位
     * @param roleName         会员角色名称
     * @param orderId          接口参数
     * @param batchNo          发货批次
     * @param receiveBill      收货回单url地址
     * @return 查询结果
     */
    Wrapper<Void> receiveOrder(String userName, String organizationName, String jobTitle, String roleName, Long orderId, Integer batchNo, String receiveBill);

    /**
     * “待确认收货订单” - 确认收货Pay
     * @param userName         登录用户姓名
     * @param organizationName 组织机构名称
     * @param jobTitle         职位
     * @param roleName         会员角色名称
     * @param order            订单
     * @param batchNo          发货批次
     * @param receiveBill      收货回单url地址
     * @return 查询结果
     */
    Wrapper<Void> receiveOrder(String userName, String organizationName, String jobTitle, String roleName, OrderDO order, Integer batchNo, String receiveBill);

    /**
     * 更新拼团订单状态
     * @param orderId 订单Id
     * @param promotionStatus 营销活动状态
     * @param groupId 拼团Id
     * @return 处理结果
     */
    Wrapper<Void> updateGroupOrderStatus(String userName, String organizationName, String jobTitle, String roleName, Long orderId, OrderPromotionStatusEnum promotionStatus, Long groupId);

    /**
     * 订单分页查询 - 通用 - 所有订单类型下拉框列表
     * @return 查询结果
     */
    Wrapper<List<DropdownItem>> getAllOrderType();

    /**
     * 提交订单 - 查询满额包邮的商品总运费
     * @param headers   HttpHeaders信息
     * @param freightVO 接口参数
     * @return 查询结果
     */
    Wrapper<BigDecimal> findProductFreeFreight(HttpHeaders headers, OrderProductFreeFreightVO freightVO);
}
